5.05. Первая программа
Первая программа
А теперь давайте немного попрактикуемся и посмотрим, как выглядит работа с C#. Пройдитесь и выполните все действия по алгоритму, но на каждом шаге старайтесь исследовать то, что на экране, чтобы понимать.
- Скачайте и установите Visual Studio:
- Community – бесплатная;
- Professional, Enterprise, Preview – платные.
- Запустите Visual Studio.
- Нажмите «Создание проекта».
- Вам будет предложен целый ряд шаблонов – выберем «Консольное приложение (Майкрософт)».
- Заполним атрибуты:
- Имя проекта – HelloWorld;
- Расположение – укажем папку для хранения проекта;
- Имя решения – HelloWorld;
- Можно включить галочку «Поместить решение и проект в одном каталоге». Ниже будет указано, в каком каталоге будет проект. Жмём «Далее».
- Платформа – выбрать последнюю (к примеру, .NET 8.0);
- Можем включить поддержку контейнера – но потребуется Docker.
- Если включаем поддержку контейнера – выбираем ОС контейнера – Linux и тип сборки контейнера – Dockerfile. Создаём проект.
- Справа будет обозреватель решений – это структура проекта. В нашем случае, мы имеем Program.cs – файл с кодом: Console.WriteLine("Hello, World!");
- Поскольку проект простой, нам даже ничего и не потребуется, уже можно запускать, нажав на кнопку запуска на панели инструментов – в моём случае, запуск с контейнером, поэтому будет написано «Dockerfile»:
- Запуск выполнит сборку программы и отобразит в окне вывода результат:
-
Сборка выполняется через ПКМ по проекту или решению – «Собрать» (Build).
-
Если открыть папку решения в проводнике, мы увидим файлы проекта – Dockerfile, HelloWorld.csproj, HelloWorld.sln.
-
Собранная программа сохраняется по пути:
HelloWorld\bin\Debug– для Debug сборки (отладочная);HelloWorld\bin\Release– для Release сборки (релизная);
-
Тип сборки меняется через панель инструментов:
- По умолчанию, набор файлов будет содержать следующее:
- Для запуска на Windows ничего не потребуется – достаточно открыть исполняемый файл HelloWorld.exe. Но конкретно наша программа закроется сразу – это связано с тем, что в её коде ничего нет – после вывода текста Hello World! программа завершит свою работу.
Усложним задачу – добавим паузу перед закрытием консоли, и добавим юнит-тесты с использованием xUnit.
- Изменим код – добавим к коду класс, метод, и ожидание нажатия клавиши:
using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
Console.WriteLine("Нажмите любую клавишу для выхода...");
Console.ReadLine();
}
}
}
Теперь программа будет ждать нажатия клавиши после вывода текста, прежде чем закроется:

Для принудительного закрытия программы используем остановку на панели:
- Добавим юнит-тест. В Visual Studio это будет ещё один проект в составе решения, поэтому нажимаем ПКМ на решении – Добавить – Новый проект:

-
Выбираем тип шаблона – Тестовый проект xUnit (Майкрософт).
-
Назовём проект «HelloWorld.Tests».
-
После создания Visual Studio автоматически создаст тестовый проект с файлом UnitTest1.cs.
-
Теперь нам нужно связать тестовый проект с основным. Для этого нажимаем ПКМ на тестовом проекте – Добавить – Ссылка на проект – выбираем наш проект HelloWorld – ОК.
-
Создадим отдельный класс. В основном проекте HelloWorld добавляем новый класс HelloService.cs:

Добавляем код в наш новый HelloService.cs
namespace HelloWorld
{
public class HelloService
{
public string GetMessage()
{
return "Hello, World!";
}
}
}
- Изменим Program.cs, чтобы использовать новый класс:
using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
var service = new HelloService();
Console.WriteLine(service.GetMessage());
Console.WriteLine("Нажмите любую клавишу для выхода...");
Console.ReadLine();
}
}
}
- Пишем юнит-тест в UnitTest1.cs:
using Xunit;
using HelloWorld;
namespace HelloWorld.Tests
{
public class UnitTest1
{
[Fact]
public void TestGetMessage_ReturnsHelloWorld()
{
// Arrange
var service = new HelloService();
// Act
var result = service.GetMessage();
// Assert
Assert.Equal("Hello, World!", result);
}
}
}
- Запускаем Test Explorer (Обозреватель тестов):

- Запускаем все тесты и ждём результаты:

Усложним ещё. Теперь добавим инструменты логирования, к примеру, Serilog. Но здесь нам понадобится устанавливать дополнительные пакеты, так мы и познакомимся с NuGet.
- Переходим в менеджер пакетов NuGet через ПКМ по основному проекту – Управление пакетами NuGet – Обзор – пишем Serilog – выбираем и устанавливаем:

- Устанавливаем также Serilog.Sinks.Console:

Второй вариант – не искать через поисковик, а просто перейти в Package Manager Console (консоль менеджера пакетов):

И выполнить там команды:
Install-Package Serilog
Install-Package Serilog.Sinks.Console
- Настроим логгер – для этого нам понадобится изменить Program.cs:
using System;
using Serilog;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
// Инициализация логгера
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();
try
{
Log.Information("Запуск приложения");
var service = new HelloService();
var message = service.GetMessage();
Console.WriteLine(message);
Log.Information("Сообщение выведено: {Message}", message);
Console.WriteLine("Нажмите любую клавишу для выхода...");
Console.ReadLine();
}
catch (Exception ex)
{
Log.Fatal(ex, "Ошибка при выполнении программы");
}
finally
{
Log.CloseAndFlush(); // Важно!
}
}
}
}
- При запуске мы увидим логи в консоли:

Вот так пишется программа на C#.
Этого пока достаточно. Если вы успешно проделали эти шаги, вы:
- ознакомились с IDE Visual Studio;
- успешно собрали и запустили программу;
- подключили пакеты и добавили xUnit;
- написали модульный тест (юнит-тест);
- добавили логирование при помощи Serilog;
- а если вы ещё и справились c Docker – вы герой!